#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Pinball many Balls
# beenden: pkill -9 file.py

import sys
import time
import random
import pygame
import numpy as np
import math
from copy import copy, deepcopy

ScreenW=60
ScreenH=40
Zoom=15
RasterColor=50
HindernissColor=100
xPos=ScreenW/2 # Mouse-Cursor
yPos=ScreenH/2
GliederMax=3 # Anzahl Glieder
Laenge=4 # Länge eines Gliedes
Rand=10
ElementX=xPos # Startwerte
ElementY=yPos
Richtung=45 # Richtung der Kette

# ------------------------------------------
def Update():
#  global Winkel, xPos, yPos # Zugriff auf Variable erhalten
  global ElementX, ElementY, Richtung # Zugriff auf Variable erhalten

  window.fill((0, 0, 0)) # Bildschirm loeschen

  # Raster zeichnen
  for x in range(0, ScreenW):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (x*Zoom, 0), (x*Zoom, ScreenW*Zoom))
  for y in range(0, ScreenH):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (0, y*Zoom), (ScreenW*Zoom, y*Zoom))

  # Bildschirm ausgeben
  for x in range(0, ScreenW):
    for y in range(0, ScreenH):
      if Bildschirm[x,y] == 1: # Hinderniss
        pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

  # Framerate
  myfont = pygame.font.SysFont("freesans", Zoom)
  label = myfont.render(str(clock), 1, (255,255,255))
  window.blit(label, (300,0))

  # Kette zeichnen
#  ElementX=xPos
#  ElementY=yPos
  GliedX=ElementX
  GliedY=ElementY
  for a in range(0, GliederMax):
    for i in range(0, Laenge):
      x=int(round(GliedX+i*math.sin(Winkel[a]*math.pi/180)))
      y=int(round(GliedY-i*math.cos(Winkel[a]*math.pi/180)))
      pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))
      if i==0: # Gliederwechsel?
        pygame.draw.rect(window, (HindernissColor,100+HindernissColor,HindernissColor), (x*Zoom,y*Zoom,0.5*Zoom,0.5*Zoom))

      # Kontaktflächen ermitteln
      if Bildschirm[x,y+1]==1: # Feld darunter belegt?
        pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y+1)*Zoom,1*Zoom,0.3*Zoom))
        if x>xPos: # Links von Curser?
          Winkel[a]-=5
        if x<=xPos: 
          Winkel[a]+=5
      if Bildschirm[x,y-1]==1: # Feld darüber belegt?
        pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,1*Zoom,0.3*Zoom))
        if x>xPos: # Links von Curser?
          Winkel[a]+=5
        if x<=xPos: 
          Winkel[a]-=5
      if Bildschirm[x-1,y]==1: # Feld links belegt?
        pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
        if y>yPos: # oberhalb von Curser?
          Winkel[a]-=5
        if y<=yPos: 
          Winkel[a]+5
      if Bildschirm[x+1,y]==1: # Feld rechts belegt?
        pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), ((x+1)*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
        if y>yPos: # oberhalb von Curser?
          Winkel[a]+=5
        if y<=yPos: 
          Winkel[a]-=5

    GliedX=x # Neuen Startwert für nächstes Glied
    GliedY=y


  # Kette bewegen
  Abstand=1
  x=int(round(ElementX+Abstand*math.sin(Richtung*math.pi/180)))
  y=int(round(ElementY-Abstand*math.cos(Richtung*math.pi/180)))
  if(Bildschirm[x,y]==1):
    # Hinderniss erreicht, Einschlagwinkel ermitteln
    Einschlagwinkel=0
    if(Bildschirm[x+1,y]==1):
      Einschlagwinkel=90
    if(Bildschirm[x,y+1]==1):
      Einschlagwinkel=180
    Richtung=2*Einschlagwinkel-Richtung
  else:
    if random.randint(0,5)==0: # nur selten eine Bewegung ausführen
      ElementX=x
      ElementY=y



  # MouseCursor Home einzeichnen
  x=xPos
  y=yPos
  pygame.draw.rect(window, (HindernissColor,2*HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom),2)


  pygame.display.flip()

# ------------------------------------------
# M A I N
# ------------------------------------------
# Array 
Bildschirm=np.zeros((ScreenW,ScreenH),dtype=int) # initialisieren mit 0
Winkel=np.zeros((GliederMax),dtype=int) # initialisieren mit 0

Winkel[0]=90
Winkel[1]=0
Winkel[2]=90

# Hindernisse festlegen

# Hinderniss am Boden
for x in range(Rand, ScreenW-Rand):
  Bildschirm[x,ScreenH-Rand]=1
# Hinderniss Decke
for x in range(Rand, ScreenW-Rand):
  Bildschirm[x,Rand]=1
# Hinderniss linke Wand
for x in range(Rand, ScreenH-Rand):
  Bildschirm[Rand,x]=1
# Hinderniss rechte Wand
for x in range(Rand, ScreenH-Rand):
  Bildschirm[ScreenW-Rand,x]=1

Bildschirm[10,12]=1
Bildschirm[11,12]=1
Bildschirm[12,12]=1
Bildschirm[10,11]=1
Bildschirm[11,11]=1
Bildschirm[12,11]=1
Bildschirm[20,12]=1
Bildschirm[20,13]=1
Bildschirm[20,14]=1

#create the screen
pygame.init()
window = pygame.display.set_mode((ScreenW*Zoom,ScreenH*Zoom))

# time.sleep(10.00) # warten

#input handling
clock = pygame.time.Clock()
while True: 
  clock.tick(40) # mit 50 fps arbeiten

  Update()
  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      sys.exit(0) 
    elif event.type == pygame.MOUSEMOTION:
       x, y = event.pos
       xPos=x/Zoom; yPos=y/Zoom;
#       print "mouse at (%d, %d)" % (xPos,yPos)



# ---------------------------------------------
# alter Code

'''
  # Zollstock zeichnen
  x=xPos
  y=yPos
  print "---------"
  for i in range(0, GliederMax):
    for j in range(0, Laenge):
      x=int(round(x+j*math.sin(Winkel[i]*math.pi/180)))
      y=int(round(y-j*math.cos(Winkel[i]*math.pi/180)))
      print x,y
      pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))
      if j==0:
        pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,0.5*Zoom,0.5*Zoom)) # neues Glied
'''


'''
  # MouseCursor Home einzeichnen
  x=xPos
  y=yPos
# simples Rechteck
#  pygame.draw.rect(window, (HindernissColor,2*HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom),2)
# ein Block
  for i in range(0, Laenge):
    x=int(round(xPos+i*math.sin(Winkel*math.pi/180)))
    y=int(round(yPos-i*math.cos(Winkel*math.pi/180)))
    pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

    # Kontaktflächen ermitteln
    if Bildschirm[x,y+1]==1: # Feld darunter belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y+1)*Zoom,1*Zoom,0.3*Zoom))
      if x>xPos: # Links von Curser?
        Winkel-=10
      if x<=xPos: 
        Winkel+=10
    if Bildschirm[x,y-1]==1: # Feld darüber belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,1*Zoom,0.3*Zoom))
      if x>xPos: # Links von Curser?
        Winkel+=10
      if x<=xPos: 
        Winkel-=10
    if Bildschirm[x-1,y]==1: # Feld links belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), (x*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
      if y>yPos: # oberhalb von Curser?
        Winkel-=10
      if y<=yPos: 
        Winkel+=10
    if Bildschirm[x+1,y]==1: # Feld rechts belegt?
      pygame.draw.rect(window, (100+HindernissColor,HindernissColor,HindernissColor), ((x+1)*Zoom,(y)*Zoom,0.3*Zoom,1*Zoom))
      if y>yPos: # oberhalb von Curser?
        Winkel+=10
      if y<=yPos: 
        Winkel-=10
'''
